package src.H_JDBC;

import com.mchange.v2.c3p0.ComboPooledDataSource;

import javax.sql.DataSource;
import java.sql.*;

// c3p0数据库连接池（单线程，性能较差，适用于小型系统），开放的源代码的JDBC连接池
public class H_03_c3p0 {
    // 前提：先导入jar包，c3p0-0.9.5.5、mchange-commons-java-0.2.19
    // 把src目录变成Sources(蓝色)目录，c3p0-config.xml放在src目录下，且名字必须为c3p0-config.xml
    public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement st = null;
        ResultSet re = null;
        try {
            conn = JdbcUtils_C3P0.getConnection(); //原来是自己实现的，现在用别人实现的
            String sql = "insert into tang(name,sex,age) values (?,?,?)"; //使用问号?占位符代替参数
            st = conn.prepareStatement(sql); //预编译SQL，先写sql，然后不执行
            //手动给参数赋值 属性和类型要按顺序匹配 例如id，name 只能 int，string，不可不按顺序反过来
            st.setString(1,"小猪猪");
            st.setString(2,"男");
            st.setInt(3,22);
            int i = st.executeUpdate(); // 执行
            if (i > 0){
                System.out.println("插入成功！");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            JdbcUtils_C3P0.release(conn,st,re);
        }
    }
}

class JdbcUtils_C3P0{
    private static DataSource dataSource = null;

    static {
        dataSource = new ComboPooledDataSource("MySQL"); // 读取xml文件
    }

    // 获取连接
    public static Connection getConnection() throws SQLException {
        // 无论使用什么数据源，本质还是一样的。DataSource接口不会变，所以方法DataSource.getConnection()就不会变
        return dataSource.getConnection(); // 从数据源中获取连接
    }

    // 释放资源
    public static void release(Connection conn, Statement st, ResultSet re){
        try {
            if (re != null){
                re.close();
            }
            if (st != null){
                st.close();
            }
            if (conn != null){
                conn.close();
            }
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }
}
